#include <stdio.h> // Для printf
#include <stdlib.h> // Для malloc
#include <string.h> // bzero и иже с ним
#include <unistd.h> // Для closes
#include <arpa/inet.h> // inet_ntoa

#include <network.h>
#include <server.h>

int waiting(struct game *game, struct client *client){
	printf("Клиент %s/%d ожидает игрока в игре id=%d (%s).\n", client->ip, client->id, game->id, game->name);	
	char *receiveMessage;
	int code;
	int disconnect = -1;
	while(((disconnect = recv(client->sockfd, &code, sizeof(int), MSG_PEEK)) > 0) && (game->play == 1)){ // Ожидает второго игрока
		receiveMessage = receiving(client->sockfd);
		switch(code){
			case GAMEEXIT:{
				return -1;
				break;
			}
			case READY:{
				return 1;
				break;
			}
			case WHERE:{
				sending(client->sockfd, YOUHERE, "В игре. Ожидание.");
				break;
			}
			default:{
				sending(client->sockfd, WRONGCODE, NULL);
				printf("Читак %s/%d выброшен из сервера.\n", client->ip, client->id);
				shutdown(client->sockfd, 2);
				close(client->sockfd);
				return -2;
				break;
			}
		}
	}
	if (disconnect == 0){
		return 0;
	}
	return 1;
}


void strtoint (int *i, char ch, char ch2)
{
	switch(ch){
		case '0': *i = 0; break;
		case '1': *i = 1; break;
		case '2': *i = 2; break;
		case '3': *i = 3; break;
		case '4': *i = 4; break;
		case '5': *i = 5; break;
		case '6': *i = 6; break;
		case '7': *i = 7; break;
		case '8': *i = 8; break;
		case '9': *i = 9; break;
		default:
			if (ch=='-'){
				if (ch2=='1') *i=-1;
				if (ch2=='2') *i=-2;
				}
			break;
	}
}

int playing(struct game *game, struct client *client){
	printf("Клиент %s/%d в игре id=%d (%s).\n", client->ip, client->id, game->id, game->name);	
	char *receiveMessage;
	int code;
	int disconnect;
	if(client->sockfd == game->white->sockfd){
		sending(game->black->sockfd, JOINED, NULL);
	}
	else{
		sending(game->white->sockfd, JOINED, NULL);
	}
	while((game->play == 2) && ((disconnect = recv(client->sockfd, &code, sizeof(int), MSG_PEEK)) > 0)){
		receiveMessage = receiving(client->sockfd);
		switch(code){
			case MOVE:{
				int i, j=0;
				int step[9];
				char step_char[9];

				for(i = 0; i < 9+j; i++){
					strtoint (&step[i-j], receiveMessage[i], receiveMessage[i+1]);
					if (receiveMessage[i]=='-') {i++;j++;}		//Да, стыдно, но иначе никак
					//step[i] = (int) receiveMessage[i];
					//printf ("%d", step[i]);
				}
				send_move(step, game);//int send_move(int move[9], struct)

					
				sprintf(step_char, "%d%d%d%d%d%d%d%d%d", step[0],step[1],step[2],step[3],step[4],step[5],step[6],step[7],step[8]);

				sending(game->white->sockfd, MOVED, step_char);
				sending(game->black->sockfd, MOVED, step_char);
				break;
			}
			case READY:{
				break;
			}
			case CHAT:{
				if(client->sockfd == game->white->sockfd){
					sending(game->black->sockfd, CHAT, receiveMessage);
				}
				else{
					sending(game->white->sockfd, CHAT, receiveMessage);
				}
				break;
			}
			case WHERE:{
				sending(client->sockfd, YOUHERE, "В игре. Игра.");
				break;
			}
			case GAMEEXIT:{
				if(game->white->sockfd == client->sockfd){
					sending(game->black->sockfd, ENEMYFLED, NULL);
				}
				else{
					sending(game->white->sockfd, ENEMYFLED, NULL);
				}
				return -1;
				break;
			}
			default:{
				sending(client->sockfd, WRONGCODE, NULL);
				printf("Читак %s/%d выброшен из сервера.\n", client->ip, client->id);
				if(game->white->sockfd == client->sockfd){
					sending(game->black->sockfd, ENEMYWRONGCODE, NULL);
				}
				else{
					sending(game->white->sockfd, ENEMYWRONGCODE, NULL);
				}
				shutdown(client->sockfd, 2);
				close(client->sockfd);
				return -2;
				break;
			}
		}
	}
	if (disconnect == 0){
		return 0;
	}
	return 1;
}

int inGame(struct game *game, struct client *client){
	int result;
	int online;
	result = waiting(game, client);
	switch(result){
		case 1:{
			break;
		}
		case 0:{
			printf("Клиент %s/%d покинул игру id=%d (%s) во время ожидания (вылетел).\n", client->ip, client->id, game->id, game->name);
			destroyGame(game);
			return -1;
			break;
		}
		case -1:{
			printf("Клиент %s/%d покинул игру id=%d (%s) во время ожидания (добровольно).\n", client->ip, client->id, game->id, game->name);
			destroyGame(game);
			return 0;
			break;
		}
		case -2:{
			destroyGame(game);		
			return -2;
			break;
		}
	}
	
	result = playing(game, client);
	switch(result){
		case 1:{
			printf("Клиент %s/%d покинул игру id=%d (%s) во время игры (из-за второго игрока).\n", client->ip, client->id, game->id, game->name);
			return 1;
			break;
		}
		case 0:{
			printf("Клиент %s/%d покинул игру id=%d (%s) во время игры (вылетел).\n", client->ip, client->id, game->id, game->name);
			destroyGame(game);
			return -1;
		}
		case -1:{
			printf("Клиент %s/%d покинул игру id=%d (%s) во время игры (добровольно).\n", client->ip, client->id, game->id, game->name);
			destroyGame(game);
			return 10;
		}
		case -2:{
			destroyGame(game);
			return -20;
		}
	}
	return 666;
}
